import json
from datetime import datetime
import backtrader as bt
import akshare as ak
import pandas as pd
import time

# 要计算的列表，推荐的10个股票代码
lst = [
    '600519',
    '000651',
    '600612',
    '600602',
    '600660',
    '600887',
    '000568',
    '300033',
    '600621',
    '000858'
       ]

def a_code_a_(code,code_name,data,savekey,key):
    '''
        对股票的某个具体的进行处理
    :param code: 股票代码
    :param code_name: 股票名称
    :param data:  股票数据 pandas.DataFrame类型
    :param savekey: 要保存在json的 Key和文件名的
    :param key: 该key在data中那一列
    :return:
    '''
    # 要处理的月份
    month_lst = [
        [2024, 1],
        [2024, 2],
        [2024, 3],
        [2024, 4],
        [2024, 5],
        [2024, 6],
        [2024, 7],
        [2024, 8],
        [2024, 9],
        [2024, 10],
        [2024, 11],
        [2024, 12],
        [2025, 1]
    ]
    # 这个依然是标准的json处理程序
    j_month_a_code = json.loads('{}')
    j_month_a_code_lst = []
    # 循环获取每一个月
    for a_month in month_lst:
        a_month_code = {}
        # 判断，将所有该年该月的数据保存到一个新的pandas.DataFrame中
        data_month = data[(data['year'] == a_month[0]) & (data['month'] == a_month[1])]
        # 此时比如要获取的是2024年01月的数据
        # data_month中就是2024年1月的所有数据
        a_month_code['月份'] = f'{a_month[0]}-{a_month[1]}'
        a_month_code['代码'] = code
        a_month_code['名称'] = code_name
        # 使用mean()求对列平均值，列命就是参数的key,根据传参可能是平均律等等
        a_month_code[savekey] = data_month[key].mean()
        # 将一个月的添加到列表
        j_month_a_code_lst.append(a_month_code)
    j_month_a_code['data'] = j_month_a_code_lst
    j_month_a_code = json.dumps(j_month_a_code, ensure_ascii=False)
    # 保存，保存名称是 推荐股票股票名 要算的名称.json
    with open(f'推荐股票{code_name}月{savekey}.json','w',encoding='utf-8') as f:
        f.write(j_month_a_code)

def do2():
    # 起止时间
    # 设置长一点无所谓
    start = '20201201'
    end = '20250107'

    # 获取股票代码对应的名称
    #
    stock_info_a_code_name_df = ak.stock_info_a_code_name()

    for a_code in lst:
        '''
        循环对每个股票执行
        '''
        # 通过股票代码获取股票名称
        code_name = stock_info_a_code_name_df[stock_info_a_code_name_df['code'] == a_code].iloc[0].tolist()[1]


        # 查询这些数据，和下面的市盈率不在一个接口
        '''
            ['平均成交量', '成交量'],
            ['平均成交额', '成交额'],
            ['平均最高价','最高'],
            ['平均最低价', '最低'],
            ['平均开盘价', '开盘'],
            ['平均收盘价', '收盘'],
            '''
        stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol=a_code, period="daily", start_date=start, end_date=end,
                                                adjust="")

        # 将日期列转换格式，
        stock_zh_a_hist_df['日期'] = pd.to_datetime(stock_zh_a_hist_df['日期'])
        # 新建列year和month
        # 比如行中日期的数据是2022-01-02
        # 那么year的数据就是2022，month就是01
        stock_zh_a_hist_df['year'] = stock_zh_a_hist_df['日期'].dt.year
        stock_zh_a_hist_df['month'] = stock_zh_a_hist_df['日期'].dt.month

        # 第一个数据接口能获取的数据
        ready_todo_lst1 = [
            ['平均成交量', '成交量'],
            ['平均成交额', '成交额'],
            ['平均最高价','最高'],
            ['平均最低价', '最低'],
            ['平均开盘价', '开盘'],
            ['平均收盘价', '收盘'],
        ]

        for ready_todo in ready_todo_lst1:
            # 循环对每一个代码的每一个要保存的进行处理
            # 调用上面自己写的函数
            a_code_a_(a_code,code_name,stock_zh_a_hist_df,ready_todo[0],ready_todo[1])


        # 下面同理，只是接口不一样
        stock_a_indicator_lg_df = ak.stock_a_indicator_lg(symbol=a_code)
        # 转换格式，以便判断月份
        stock_a_indicator_lg_df['trade_date'] = pd.to_datetime(stock_a_indicator_lg_df['trade_date'])
        stock_a_indicator_lg_df['year'] = stock_a_indicator_lg_df['trade_date'].dt.year
        stock_a_indicator_lg_df['month'] = stock_a_indicator_lg_df['trade_date'].dt.month
        # 从该接口要取的值
        ready_todo_lst2 = [
            ['平均市盈率','pe'],
            ['平均市盈率TTM', 'pe_ttm'],
            ['平均市净率', 'pb'],
            ['平均市销率', 'ps'],
            ['平均市销率TTM', 'ps_ttm'],
            ['平均总市值', 'total_mv'],
        ]
        # 循环取值
        for ready_todo in ready_todo_lst2:
            a_code_a_(a_code,code_name,stock_a_indicator_lg_df,ready_todo[0],ready_todo[1])

        # 处理完成一个代码进行输出
        print(f'{code_name} is ok')

if __name__ == '__main__':
    '''
    
    '''
    do2()


